package com.woniu.controller;


import com.woniu.service.UserService;
import com.woniu.utils.CookieUtils;
import com.woniu.utils.JwtUtils;
import javafx.scene.effect.DisplacementMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author huangjianbin
 * @since 2023-02-07 11:59:17
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping("register")
    @ResponseBody
    public String register(String username,String password,String repass){
        try {
            userService.register(username,password,repass);
        }catch (RuntimeException exception){
            exception.printStackTrace();  //打印异常栈
            return exception.getMessage();  //返回异常信息
        }
        return "ok";
    }

    @RequestMapping("addCookie")
    @ResponseBody
    public String addCookie(String name, String value, HttpServletResponse response){

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(160);//设置cookie的有效期,单位秒
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }


    @RequestMapping("queryCookie")
    @ResponseBody
    public String queryCookie(HttpServletRequest request){

        Cookie[] cookies = request.getCookies();
        for(int i=0;cookies!=null && i<cookies.length;i++){
            System.out.println(cookies[i]);
        }

        return "ok";
    }



    @RequestMapping("updateCookie")
    @ResponseBody
    public String updateCookie(String name, String value, HttpServletResponse response){

        //更新cookie  重新写一遍

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(160);//设置cookie的有效期,单位秒   如果为0,就表示删除
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }



    @RequestMapping("delCookie")
    @ResponseBody
    public String delCookie(String name, String value, HttpServletResponse response){

        //删除cookie  cookie.setMaxAge(0)

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        // domain + path  确定了cookie的生效范围
        //cookie.setDomain(""); //domain 域名   可以自己指定域名,也可以不写,不写的话默认就是当前网站的地址.
        cookie.setPath("/"); //在域名范围内的那些路径下是有效的   / 表示在当前网站下都有效
        cookie.setMaxAge(0);//设置cookie的有效期,单位秒   如果为0,就表示删除
        cookie.setComment("测试cookie");

        response.addCookie(cookie);

        return "ok";
    }

    @RequestMapping("login")
    @ResponseBody
    public String login(String username,String password,HttpServletResponse response){
        try {
            userService.login(username,password);
            //将jwtToken作为cookie返回
            String token = JwtUtils.createToken(username, 15);
            CookieUtils.setUserToken2Cookie(response,token);
//            String token = JwtUtils.createToken(userName, 15);
//            CookieUtils.setUserToken2Cookie(response, token);
        }catch (RuntimeException exception){
            exception.printStackTrace();  //打印异常栈
            return exception.getMessage();  //返回异常信息
        }
        return "ok";
    }


    @RequestMapping("currentUserName")
    @ResponseBody
    public String currentUserName(HttpServletRequest request){
        //从cookie中拿到userToken
        String userTokenFromCookie = CookieUtils.getUserTokenFromCookie(request);
        //然后从userToken中解析出用户名
        String accountFromToken = JwtUtils.getAccountWithoutException(userTokenFromCookie);
        return accountFromToken;
    }


    @RequestMapping("logout")
    @ResponseBody
    public String logout(HttpServletResponse response){
        CookieUtils.deleteUserTokenFromCookie(response);
        return "ok";
    }

}

